package sanmubird.club.mock.dao.orm.embedded;

import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.util.CollectionUtils;
import sanmubird.club.mock.dao.UserDaoTestConfig;
import sanmubird.club.mock.dao.beans.UserConverter;
import sanmubird.club.mock.dao.beans.UserDTO;
import sanmubird.club.mock.dao.beans.UserPo;
import sanmubird.club.mock.dao.orm.UserRepository;

import java.util.List;

/**
 * <p>
 * 注解 @ContextConfiguration 会实例化括号里面的classes; 从这里也应看到整个Spring并没有启动
 * 注解 @EnableAutoConfiguration 从classpath中搜索所有META-INF/spring.factories配置文件; 然后，将其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器；
 * 注解 @MapperScan 则是 扫描 需要执行的 mapper 文件
 * <p>
 * 如果 不使用 @EnableAutoConfiguration 则启动失败 会抛出 Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
 * 如果 不使用 @MapperScan() 则启动失败 会抛出 UserMapper 无法注入
 * 如果 不使用 @ContextConfiguration 则启动失败, 无法创建 UserRepositoryTest4Spring 实例 ; 因为自动注入的 bean 没有被初始化
 * <p>
 * 通过上面 能得出这样一个结论(不保证这个结论就是正确的)
 * 1: 注解 @EnableAutoConfiguration 利用 springBoot 的能力 进行 各种配置文件的配置
 * 2: 注解 @MapperScan 解决 mapper文件的 扫描和 mapper接口 自动装配的问题
 * 3: 注解 @ContextConfiguration 解决 其他bean 自动装配的问题
 */
@Slf4j
@EnableAutoConfiguration
@MapperScan("sanmubird.club.mock.dao.orm")
@ContextConfiguration(classes = {UserDaoTestConfig.class})
public class UserRepositoryTest4Spring extends AbstractJUnit4SpringContextTests {

	@Autowired
	private UserConverter userConverter;

	@Autowired
	private UserRepository userRepository;

	@Rollback
	@Test()
	public void testSave() {
		UserDTO userDTO = UserDTO.builder().id(34).name("demo").age(12).build();
		UserPo userPo = userConverter.dtoToPo(userDTO);
		int save = userRepository.save(userPo);
		Assert.assertEquals(1, save);
		List<UserPo> userPos = userRepository.selectList(userPo);
		log.info("获取到的内容是: {}", userPos);
		Assert.assertFalse(CollectionUtils.isEmpty(userPos));
	}

	@Test
	public void testQuery() {
		UserDTO userDTO = new UserDTO();
		userDTO.setName("zs");
		UserPo userPo = userConverter.dtoToPo(userDTO);
		List<UserPo> userPos = userRepository.selectList(userPo);
		log.info("获取到的内容是: {}", userPos);
		Assert.assertFalse(CollectionUtils.isEmpty(userPos));
	}

	@Rollback
	@Test()
	public void testDelete() {
		UserDTO userDTO = new UserDTO();
		userDTO.setName("zs");
		UserPo userPo = userConverter.dtoToPo(userDTO);
		int delete = userRepository.delete(userPo);
		Assert.assertEquals(1, delete);
		List<UserPo> userPos = userRepository.selectList(userPo);
		log.info("获取到的内容是: {}", userPos);
		Assert.assertTrue(CollectionUtils.isEmpty(userPos));
	}
}